package observer;

import java.util.HashSet;
import java.util.Set;

/**
 * 消息接收者，此类为抽象类，所有使用本类的对象，应该重写它的receiver方法，用以实现对不通的消息，做出定制的响应。
 */
public abstract class Receiver {

    /**
     * 此对象，用于保存消息接收者，要监听的消息动作。
     */
    private Set<String> actions;

    /**
     * 构造方法，初始化必要参数
     */
    public Receiver() {
        actions = new HashSet<String>();
    }

    /**
     * 消息处理让发，具体的使用者，需要重写此方法，以定制对不同的消息的响应。
     *
     * @param transmitter 消息传递者
     * @return 返回false则消息，不会被消费，返回true则表示消息传递到此，就结束，后面的消息接收者，即使有注册相同的action，也无法接收到消息。
     */
    public abstract boolean receiver(Transmitter transmitter);

    /**
     * 添加此接收者要监听的消息传递者的，消息动作。
     *
     * @param action
     */
    public void addAction(String action) {
        this.actions.add(action);
    }

    /**
     * 注册此消息接收者，到指定的区域，此区域有flag来决定，它只是一个标志。
     * 当此flag表示的区域不存在时，Manager将会自动创建一个新的区域来存放此消息接收者。
     *
     * @param flag 区域标志。
     */
    public void register(String flag) {
        Manager.getInstance().register(flag, this);
    }

    /**
     * 注销在flag表示的区域中的此消息接收者。
     *
     * @param flag 确定要注销此接收者的区域
     */
    public void unregister(String flag) {
        Manager.getInstance().unregister(flag, this);
    }

    /**
     * 判断此消息接收者，是否注册了消息动作。
     *
     * @return 存在消息动作，返回false，没有消息动作，返回true
     */
    boolean isEmpty() {
        return this.actions.size() <= 0 ? true : false;
    }

    /**
     * 判断此消息接收者，是否包含指定的消息动作
     *
     * @param action 要判断的消息动作
     * @return 存在则返回true， 不存在的返回false
     */
    boolean isContains(String action) {
        return this.actions.contains(action);
    }
}
